import type { ExtractPropTypes } from "vue";
/** 构造函数接口，用于描述组件构造函数的结构 */
export interface Constructor<P = any> {
  __isFragment?: never;
  __isTeleport?: never;
  __isSuspense?: never;
  new (...args: any[]): {
    $props: P;
  };
}

/** 提取组件的 Props 类型 包含事件(使用方式onEventName) */
export type ExtractProps<T> = T extends Constructor<infer P>
  ? P
  : T extends { props: infer PropsDef }
  ? ExtractPropTypes<PropsDef>
  : T extends (props: infer Props, ...args: any[]) => any
  ? Props
  : {};
